/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package th.stripes.resources;

import com.google.inject.Inject;
import java.io.BufferedReader;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import net.sourceforge.stripes.action.ErrorResolution;
import net.sourceforge.stripes.action.HandlesEvent;
import net.sourceforge.stripes.action.Resolution;
import net.sourceforge.stripes.action.StreamingResolution;
import net.sourceforge.stripes.action.UrlBinding;
import net.sourceforge.stripes.validation.ValidationError;
import net.sourceforge.stripes.validation.ValidationErrors;
import org.apache.commons.lang.StringUtils;
import org.json.JSONObject;
import th.config.ableContextListener;
import th.dao.KodFakultiDAO;
import th.dao.KodJantinaDAO;
import th.dao.KodJenisPengajianDAO;
import th.dao.KodJenisSekolahDAO;
import th.dao.KodNegeriDAO;
import th.dao.KodPengajianDAO;
import th.dao.KodSekolahDAO;
import th.dao.KodTahapPengajianDAO;
import th.dao.KodUniversitiDAO;
import th.dao.PoskodDAO;
import th.model.KodFakulti;
import th.model.KodJantina;
import th.model.KodJenisPengajian;
import th.model.KodJenisSekolah;
import th.model.KodNegeri;
import th.model.KodPengajian;
import th.model.KodSekolah;
import th.model.KodTahapPengajian;
import th.model.KodUniversiti;
import th.model.Poskod;
import th.model.Taha;
import th.stripes.BaseActionBean;
import th.stripes.action.TaHaRegistrationAction;
import th.stripes.services.TahaService;

/**
 *
 * @author fikri
 */
@UrlBinding("/services/taha")
public class TahaResource extends BaseActionBean implements iRest {

     private static String SUCCESSFUL = "0000";

     private static String SYSTEM_ERROR = "9999";

     @Inject
     private KodJantinaDAO kodJantinaDAO;

     @Inject
     private PoskodDAO poskodDAO;

     @Inject
     private KodNegeriDAO kodNegeriDAO;

     @Inject
     private KodSekolahDAO kodSekolahDAO;

     @Inject
     private KodJenisSekolahDAO kodJenisSekolahDAO;

     @Inject
     private KodUniversitiDAO kodUniversitiDAO;

     @Inject
     private KodTahapPengajianDAO kodTahapPengajianDAO;

     @Inject
     private KodJenisPengajianDAO kodJenisPengajianDAO;

     @Inject
     private KodPengajianDAO kodPengajianDAO;

     @Inject
     private KodFakultiDAO kodFakultiDAO;

     private Taha taha;

     @HandlesEvent("taha_enq")
     public Resolution tahaEnquiry() {

          String noAkaun = getContext().getRequest().getParameter("noAkaun");
          String noKp = getContext().getRequest().getParameter("noKp");

          String status = "";

          try {
               TahaService service = ableContextListener.newInstance(TahaService.class);

               taha = new Taha();

               taha.setNoAkaun(noAkaun);

               taha.setNoPengenalan(noKp);

               status = service.enquiryTaha(taha, status);
               if (SUCCESSFUL.equals(status)) {
                    return new StreamingResolution("application/json", toJson());
               }

          } catch (ParseException ex) {
          }

          return new ErrorResolution(401);
     }

     @HandlesEvent("reg_step1")
     public Resolution tahaRegistrationStep1() {

          String noAkaun = getContext().getRequest().getParameter("noAkaun");
          String noKp = getContext().getRequest().getParameter("noKp");

          TaHaRegistrationAction action = ableContextListener.newInstance(TaHaRegistrationAction.class);
          action.setContext(context);
          taha = new Taha();
          taha.setNoAkaun(noAkaun);
          taha.setNoPengenalan(noKp);
          action.setTaha(taha);
          action.queryAccTH();
          taha = action.getTaha();
          ValidationErrors errors = context.getValidationErrors();
          Locale locale = context.getLocale();
          for (List<ValidationError> errorList : errors.values()) {
               for (ValidationError error : errorList) {
                    return new StreamingResolution("text/plain", error.getMessage(locale));
               }
          }

          return new StreamingResolution("application/json", toJson());
     }

     @HandlesEvent("reg_taha")
     public Resolution registerTaha() {

          BufferedReader reader = null;
          String m_error = "";
          try {
               String line = "";
               StringBuilder sb = new StringBuilder();
               reader = getContext().getRequest().getReader();
               while ((line = reader.readLine()) != null) {
                    sb.append(line);
               }

               if (sb.length() > 0) {
                    JSONObject json = new org.json.JSONObject(sb.toString());
                    taha = new Taha();
                    parseFromJson(taha, json);

                    TaHaRegistrationAction action = ableContextListener.newInstance(TaHaRegistrationAction.class);
                    action.setContext(context);
                    action.setTaha(taha);
                    action.registerTaHa();

                    taha = action.getTaha();

                    ValidationErrors errors = context.getValidationErrors();
                    Locale locale = context.getLocale();
                    for (List<ValidationError> errorList : errors.values()) {
                         for (ValidationError error : errorList) {
                              return new StreamingResolution("text/plain", error.getMessage(locale));
                         }
                    }
                     return new StreamingResolution("application/json", toJson());
               }
          } catch (IOException ex) {
               m_error = ex.getLocalizedMessage();
          } catch (ParseException ex) {
               m_error = ex.getLocalizedMessage();
          }

         
          return new StreamingResolution("text/plain", m_error);
     }

     public void parseFromJson(Taha taha, JSONObject json) throws ParseException {
          SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
          taha.setNoAkaun((String) json.getString("noAkaun"));
          taha.setJenisKelab((String) json.getString("jenisKelab"));
          taha.setNama((String) json.getString("nama"));
          
          String dob = (String) json.getString("trhLahir");
          if (StringUtils.isNotBlank(dob)) {
               Date dt = sdf.parse(dob);
               sdf = new SimpleDateFormat("yyyyMMdd");
               dob = sdf.format(dt);
               taha.setTrhLahir(sdf.parse(dob));
          }
          
          taha.setUmur(Integer.parseInt((String) json.getString("umur")));
          taha.setNoPengenalan((String) json.getString("noPengenalan"));
          KodJantina jantina = kodJantinaDAO.findById((String) json.getString("jantina"));
          taha.setJantina(jantina);
          taha.setAlamat1((String) json.getString("alamat1"));
          taha.setAlamat2((String) json.getString("alamat2"));
          taha.setAlamat3((String) json.getString("alamat3"));
          taha.setAlamat4((String) json.getString("alamat4"));
          String kodPoskod = (String)json.getString("poskod");
          if (StringUtils.isNotBlank(kodPoskod)) {
               Poskod poskod = poskodDAO.findById(kodPoskod);
               taha.setPoskod(poskod);
          }         
          
          String kodNegeri = (String)json.getString("negeri");
          if (StringUtils.isNotBlank(kodNegeri)) {
               KodNegeri negeri = kodNegeriDAO.findById(kodNegeri);
               taha.setNegeri(negeri);
          }
          
          
          taha.setTelefon((String) json.getString("telefon"));
          taha.setEmail((String) json.getString("email"));
          String kodSekolah = (String) json.getString("sekolah");
          if (StringUtils.isNotBlank(kodSekolah)) {
               KodSekolah sekolah = kodSekolahDAO.findById(kodSekolah);
               taha.setSekolah(sekolah);
          }
          String kodJenisSekolah = (String) json.getString("jenisSekolah");
          if (StringUtils.isNotBlank(kodJenisSekolah)) {
               KodJenisSekolah jenisSekolah = kodJenisSekolahDAO.findById(kodJenisSekolah);
               taha.setJenisSekolah(jenisSekolah);
          }
          String kodNegeriSekolah = (String) json.getString("negeriSekolah");
          if (StringUtils.isNotBlank(kodNegeriSekolah)) {
               KodNegeri negeriSekolah = kodNegeriDAO.findById(kodNegeriSekolah);
               taha.setNegeriSekolah(negeriSekolah);
          }
          String kodUniversiti = (String) json.getString("universiti");
          if (StringUtils.isNotBlank(kodUniversiti)) {
               KodUniversiti universiti = kodUniversitiDAO.findById(kodUniversiti);
               taha.setUniversiti(universiti);
          }
          taha.setNoMatrik((String) json.getString("noMatrik"));
          String kodTahapPengajian = (String) json.getString("tahapPengajian");
          if (StringUtils.isNotBlank(kodTahapPengajian)) {
               KodTahapPengajian tahapPengajian = kodTahapPengajianDAO.findById(kodTahapPengajian);
               taha.setTahapPengajian(tahapPengajian);
          }
          String kodJenisPengajian = (String) json.getString("jenisPengajian");
          if (StringUtils.isNotBlank(kodJenisPengajian)) {
               KodJenisPengajian jenisPengajian = kodJenisPengajianDAO.findById(kodJenisPengajian);
               taha.setJenisPengajian(jenisPengajian);
          }
          String kodJurusanPengajian = (String) json.getString("jurusanPengajian");
          if (StringUtils.isNotBlank(kodJurusanPengajian)) {
               KodPengajian pengajian = kodPengajianDAO.findById(kodJurusanPengajian);
               taha.setJurusanPengajian(pengajian);
          }
          String kodFakulti = (String) json.getString("fakultiPengajian");
          if (StringUtils.isNotBlank(kodFakulti)) {
               KodFakulti fakulti = kodFakultiDAO.findById(kodFakulti);
               taha.setFakultiPengajian(fakulti);
          }
          if (StringUtils.isNotBlank((String)json.getString("trhmasukIPT"))) {
               taha.setTrhmasukIPT(sdf.parse((String) json.getString("trhmasukIPT")));
          }
          
          if (StringUtils.isNotBlank((String)json.getString("trhtamatIPT"))) {
               taha.setTrhtamatIPT(sdf.parse((String) json.getString("trhtamatIPT")));
          }
     }

     public String toJson() {

          JSONObject obj = new JSONObject();

          SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");

          if (taha != null) {
               obj.put("noAkaun", taha.getNoAkaun());
               obj.put("noAhli", taha.getNoAhli());
               obj.put("jenisKelab", taha.getJenisKelab());
               obj.put("nama", taha.getNama());
               obj.put("trhLahir", taha.getTrhLahir() != null ? sdf.format(taha.getTrhLahir()) : "");
               obj.put("umur", taha.getUmur() != null ? String.valueOf(taha.getUmur()) : "");
               obj.put("noPengenalan", taha.getNoPengenalan());
               obj.put("jantina", taha.getJantina().getNama());
               obj.put("alamat1", taha.getAlamat1());
               obj.put("alamat2", taha.getAlamat2());
               obj.put("alamat3", taha.getAlamat3());
               obj.put("alamat4", taha.getAlamat4());
               obj.put("poskod", taha.getPoskod().getPoskod());
               obj.put("kod_negeri", (taha.getNegeri() != null ? taha.getNegeri().getCode() : ""));
               obj.put("nama_negeri", (taha.getNegeri() != null ? taha.getNegeri().getDesc() : ""));
//               obj.put("negeri", taha.getNegeri());               
               obj.put("telefon", taha.getTelefon());
               obj.put("email", taha.getEmail());
               obj.put("sekolah", (taha.getSekolah() != null ? taha.getSekolah().getNama() : ""));
               obj.put("jenisSekolah", (taha.getSekolah() != null ? taha.getSekolah().getJenisSekolah().getNama() : ""));
               obj.put("negeriSekolah", (taha.getSekolah() != null ? taha.getSekolah().getNegeri().getDesc() : ""));
               obj.put("universiti", taha.getUniversiti() != null ? taha.getUniversiti().getNama() : "");
               obj.put("noMatrik", taha.getNoMatrik());
               obj.put("tahapPengajian", taha.getTahapPengajian() != null ? taha.getTahapPengajian().getNama() : "");
               obj.put("jenisPengajian", taha.getJenisPengajian() != null ? taha.getJenisPengajian().getNama() : "");
               obj.put("jurusanPengajian", taha.getJurusanPengajian() != null ? taha.getJurusanPengajian().getNama() : "");
               obj.put("fakultiPengajian", taha.getFakultiPengajian() != null ? taha.getFakultiPengajian().getNama() : "");
               obj.put("trhmasukIPT", taha.getTrhmasukIPT() != null ? sdf.format(taha.getTrhmasukIPT()) : "");
               obj.put("trhtamatIPT", taha.getTrhtamatIPT() != null ? sdf.format(taha.getTrhtamatIPT()) : "");
          }

          return obj.toString();
     }

}
